﻿using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Navigation;
using System.Linq;
using IndexMarkSilverlightClient;
using IndexMarkSilverlightClient.IndexMarkServiceReference;
using System.Windows.Media;
using System.Reflection;
using SharedCode;
using IndexMarkSilverlightClient.Views.Subscribe;

namespace IndexMarkSilverlightClient
{
    public partial class MainPage : UserControl
    {
        static MainViewModel viewModel = null;

        public static MainViewModel ViewModel
        {
            get
            {
                return viewModel;
            }
        }

        public MainPage()
        {
            InitializeComponent();
            viewModel = Resources["MainViewModel"] as MainViewModel;
            viewModel.LoadCompleted += new ViewModelBase.LoadEventHandler(viewModel_LoadCompleted);

            ApplicationNameTextBlock.MouseLeftButtonDown += (s, e) => { throw new Exception("Тестовая ошибка - не обращайте на неё внимания - возникает при нажантии на название ИС."); };
            _bError.MouseLeftButtonDown += (s, e) => { C1.Silverlight.Clipboard.SetData(_sErr); };
        }

        void viewModel_LoadCompleted(object sender, LoadEventArgs e)
        {
            if (e.Type == typeof(Term))
            {
                //TermComboBox.SelectedItem = viewModel.Terms.Where(T =>
                //    T.Start.Year <= DateTime.Now.Year && T.Stop.Year >=
                //    DateTime.Now.Year).FirstOrDefault();
                SetPeriods();
            }
            //if (e.Type == typeof(Period))
            //{
            //    //PeriodComboBox.SelectedItem = viewModel.Periods.Where(T => 
            //    //    T.Start <= DateTime.Now
            //    //    && T.Stop >= DateTime.Now).FirstOrDefault();
            //    var pid = ((Term)TermComboBox.SelectedItem).IDTerm;
            //    PeriodComboBox.SelectedItem = viewModel.Periods
            //        .First(x => x.IDPeriod == pid);
            //}
            if (e.Type == typeof(Organization))
            {
                //var pid = ((Term)TermComboBox.SelectedItem).IDOrganization;
                OrganizationComboBox.SelectedItem = viewModel.Organizations.First();
                // (x => x.IDOrganization == pid);
            }
            if (e.Type == typeof(User))
            {
                viewModel.SelectTermInit();
            }
        }

        void SetPeriods()
        {
            var o = (Organization)OrganizationComboBox.SelectedItem;
            var oid = o.IDOrganization;
            TermComboBox.ItemsSource = viewModel.Terms.Where(x =>
                x.IDOrganization == oid);
            TermComboBox.SelectedItem = viewModel.Terms.Where(x =>
                x.IDOrganization == oid &&
                x.Start.Year <= DateTime.Now.Year &&
                x.Stop.Year >= DateTime.Now.Year).FirstOrDefault();

            ApplicationNameTextBlock.Text = "Система материального стимулирования " 
                + o.Abbriviation;
            //PeriodComboBox.SelectedItem = viewModel.Periods.Where(T => 
            //    T.Start <= DateTime.Now
            //    && T.Stop >= DateTime.Now).FirstOrDefault();
            //PeriodComboBox.SelectedItem = viewModel.Periods
            //    .First(x => x.IDPeriod == pid);
        }

        // After the Frame navigates, ensure the HyperlinkButton representing the current page is selected
        private void ContentFrame_Navigated(object sender, NavigationEventArgs e)
        {
            foreach (UIElement child in LinksStackPanel.Children)
            {
                HyperlinkButton hb = child as HyperlinkButton;
                if (hb != null && hb.NavigateUri != null)
                {
                    if (hb.NavigateUri.ToString().Equals(e.Uri.ToString()))
                    {
                        VisualStateManager.GoToState(hb, "ActiveLink", true);
                    }
                    else
                    {
                        VisualStateManager.GoToState(hb, "InactiveLink", true);
                    }
                }
            }
            if (TermComboBox.SelectedItem != null)
            {
                GC.Collect();
                viewModel.SelectTermInit();
            }
        }

        // If an error occurs during navigation, show an error window
        private void ContentFrame_NavigationFailed(object sender, NavigationFailedEventArgs e)
        {
            e.Handled = true;
            ChildWindow errorWin = new ErrorWindow(e.Exception);
            errorWin.Show();
        }

        private void Button_Click(object sender, System.Windows.RoutedEventArgs e)
        {
            Application.Current.Host.Content.IsFullScreen = 
                !Application.Current.Host.Content.IsFullScreen;
        }

        private void UserControl_Loaded(object sender, RoutedEventArgs e)
        {
            viewModel.LoadOrganization();
        }

        private void TermComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            var cb = sender as ComboBox;
            viewModel.CurrentTerm = cb.SelectedItem as Term;
            if (viewModel.CurrentTerm == null)
                cb.SelectedItem = cb.Items.Cast<Term>().Where(x =>
                    x.Start <= DateTime.Now && x.Stop >= DateTime.Now).FirstOrDefault();
            else viewModel.LoadUser();
            //MessageBox.Show(viewModel.CurrentTerm == null ? "0" : viewModel.CurrentTerm.IDTerm.ToString());
            //if (viewModel.User != null)
            //{
            //    viewModel.SelectTermInit();
            //}
        }

        private void Link4_Click(object sender, RoutedEventArgs e)
        {
            Downloader dl = new Downloader();
            dl.XapDownloaded += new EventHandler<XapEventArgs>(OnPackageDownload);
            dl.LoadPackage("AdminModule.xap", "AdminModule.dll", "AdminModule.Views.Main");
        }

        void OnPackageDownload(object sender, XapEventArgs e)
        {
            ContentFrame.Content = e.DownloadedContent;
        }


        private void SubscribeButton_Click(object sender, RoutedEventArgs e)
        {
            //if (TermComboBox.Items.Count > 0 && TermComboBox.SelectedItem != null)
            //{
            //    Term term = TermComboBox.SelectedItem as Term;
            //    SubscribeWindow sw = new SubscribeWindow(term, viewModel.User);
            //    sw.Show();
            //}
            //else
            //{
            //    MessageBox.Show("Необходимо выбрать период!");
            //}
        }

        string _sErr = "";
        int _ErrCount = 0;

        internal void ShowError(Exception exception)
        {
            Exception e = exception;
            while (e.InnerException != null)
                e = e.InnerException;
            _tError.Text = "Возникло ошибок в работе системы: " + ++_ErrCount
                +" шт.\nПопробуйте нажать F5 или ссылку 'Помощь'";
            _sErr = e.ToString();

            if(ViewModel.IsSuperivsor)
                _bError.SetValue(ToolTipService.ToolTipProperty, 
                    "Возникла ошибка:\n" + e.Message + "\n" + e.StackTrace);
            
            //            _bError.SetValue(ToolTipService.ToolTipProperty, @"
            //Попробуйте сделать следующее:
            //1. Если в правом верхнем углу рядом со словом 'Пользователь' не указан Ваш логин может помочь:
            // - открытие Индексной системы в другом браузере (например в Internet Explorer или в Google Chrome);
            // - перезагрузка компьютера;
            // - если у Вашего компьютера пароль на русском языке - возможно причина в этом - тогда позвоните по телефону 567 - скажите, чтоб Вам сбросили пароль, перезагрузите систему и задайте пароль из латинских букв и цифр.
            //2. Если Ваш логин указан - вход успешен
            // - если при этом Вы не можете вносить данные позвоните по телефону 567 - скажите, чтоб Вам выдали соответствующие права.
            //3. Если возникает другая ошибка - обращайтесь на адрес smspps@ugtu.net или по телефону 596");
            _bError.Visibility = System.Windows.Visibility.Visible;
        }

        private void Button_Click_1(object sender, RoutedEventArgs e)
        {
            _bError.Visibility = System.Windows.Visibility.Collapsed;
        }

        private void Help_Click(object sender, RoutedEventArgs e)
        {

        }

        private void OrganizationComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            SetPeriods();
            //ApplicationNameTextBlock.Text = 
        }

        private void PeriodComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {

        }
    }
}